//************************************************************
//    > File Name: setzero.c
//    > Author: davis
//    > Mail:  
//    > Created Time: 2017年03月 9日 11:36:09
//***********************************************************
//http://www.cnblogs.com/eudiwffe/p/6298027.html
#include<stdio.h>
//错误的暴力方法
void setzero(int **matrix,int m,int n,int row,int col)
{
	for(int i=0;i<m;*(matrix+i*n+col)=0,++i);
	for(int i=0;i<n;*(matrix+row*n+i)=0,++i);
}
void setmatrix(int **matrix,int m,int n)
{
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(*(matrix+i*n+j)==0)
				setzero(matrix,m,n,i,j);
}

//正确的暴力方法
void setzero1(int **matrix,int m,int n,int row,int col)
{
	for(int i=0;i<m;++i)
		if(*((int *)(matrix)+i*n+col)==1)
			*((int *)matrix+n*i+col)=2;
	for(int i=0;i<n;++i)
		if(*((int *)matrix+row*n+i)==1)
			*((int *)matrix+row*n+i)=2;
}
void setmatrix1(int **matrix,int m,int n)
{
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(*((int *)matrix+i*n+j)==0)
				setzero1(matrix,m,n,i,j);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(*((int *)matrix+i*n+j)==2)
				*(matrix+i*n+j)=0;
}


//改进1
void setmatrix2(int **matrix,int m,int n)
{
	int row[m];
	int col[n];
	for(int i=0;i<m;row[i++]=1);
	for(int i=0;i<n;col[i++]=1);
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(*((int*)matrix+i*n+j)==0)
				row[i]=0,col[j]=0;
	for(int i=0;i<m;i++){
		if(row[i]) continue;
		for(int j=0;j<n;*((int*)matrix+i*n+j)=0,j++);
	}
	for(int i=0;i<n;i++){
		if(col[i]) continue;
		for(int j=0;j<m;*((int*)matrix+j*n+i)=0,j++);
	}
}


//改进2
void setmatrix3(int **matrix,int m,int n)
{
	for(int i=1;i<m;i++)
		for(int j=1;j<n;j++)
			if(*((int*)matrix+i*n+j)==0){
				*((int*)matrix+i*n)=(*((int*)matrix+i*n) ? 2:0);
				*((int*)matrix+j)=(*((int*)matrix+j) ? 2:0);
			}

	for(int i=0;i<m;i++){
		if(*((int*)matrix+i*n)==1) continue;
		for(int j=1;j<n;*((int*)matrix+i*n+j)=0,j++);
	}
	for(int i=0;i<n;i++){
		if(*((int*)matrix+i)==1) continue;
		for(int j=1;j<m;*((int*)matrix+j*n+i)=0,j++);
	}

	for(int i=0;i<m;i++){
		if(*((int*)matrix+i*n)==0){
			for(int j=0;j<m;*((int*)matrix+j*n)=0,j++);
			break;
		}
		else if(*((int*)matrix+i*n)==2) *((int*)matrix+i*n)=0;
	}
	for(int i=0;i<n;i++){
		if(*((int*)matrix+i)==0){
			for(int j=0;j<n;*((int*)matrix+j)=0,j++);
			break;
		}
		else if (*((int*)matrix+i)==2) *((int*)matrix+i)=0;
	}
}

//改进3
void setmatrix4(int **matrix,int m,int n)
{

}
void main()
{
	int a[4][4]={
		{1,0,1,1},{1,0,0,1},{1,1,1,1},{1,1,0,0}
	};
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++){
			printf("%d ",a[i][j]);
			if(j>=3) printf("\n");
		}
	printf("\n");
	//setmatrix((int **)a,4,4);
	//setmatrix1((int **)a,4,4);
	//setmatrix2((int **)a,4,4);
	//setmatrix3((int **)a,4,4);
	setmatrix4((int **)a,4,4);
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
		{
			printf("%d ",a[i][j]);
			if(j>=3) printf("\n");
		}
}
